/**
 * @param {string} name
 * @returns {(v: string) => string | true}
 */
function notEmpty(name) {
  return v => {
    if (!v || v.trim === '') {
      return `${name} is required`
    } else {
      return true
    }
  }
}

/**
 * 生成模板配置
 * @param {'jsx'|'vue'} type 模板类型
 */
function generateTemplate(type) {
  return [
    {
      type: 'add',
      path: 'src/pages/{{name}}/main.js',
      templateFile: `./template/${type}/main.hbs`
    },
    {
      type: 'add',
      path: 'src/pages/{{name}}/meta.json',
      templateFile: `./template/${type}/meta.hbs`
    },
    {
      type: 'add',
      path: 'src/pages/{{name}}/style.styl',
      templateFile: `./template/${type}/style.hbs`
    },
    {
      type: 'add',
      path: `src/pages/{{name}}/view.${type}`,
      templateFile: `./template/${type}/view.hbs`
    }
  ]
}

/**
 * @type {(plop: import('plop').NodePlopAPI): void}
 */
module.exports = function(plop) {
  plop.setGenerator('page', {
    description: '新增页面',
    prompts: [
      {
        type: 'list',
        name: 'type',
        message: '请输入模板类型 jsx/vue',
        choices: ['jsx', 'vue']
      },
      {
        type: 'input',
        name: 'name',
        message: '请输入名称',
        validate: notEmpty('name')
      },
      {
        type: 'input',
        name: 'title',
        message: '请输入页面title',
        validate: notEmpty('title')
      }
    ],
    actions: config => generateTemplate(config.type)
  })
}
